package com.maiko.maikoaiagent.rag;

import jakarta.annotation.Resource;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 初始化向量数据库（VectorStore），并将Markdown文档转化为向量后写入其中，以供后续AI检索使用
 * @author: Maiko7
 * @create: 2025-06-15 15:03
 */
// 声明为配置类，Spring 启动时会扫描并加载其中的 @Bean
@Configuration
public class LoveAppVectorStoreConfig {

    // 文档加载器：用于从磁盘、classpath 或网络加载文档（Markdown 格式）
    @Resource
    private LoveAppDocumentLoader loveAppDocumentLoader;

    // 自定义文本切分器（按 Token 切分）
    @Resource
    private MyTokenTextSplitter myTokenTextSplitter;

    // 自定义关键词增强器：用于为文档添加关键字或扩展信息
    @Resource
    private MyKeywordEnricher myKeywordEnricher;

    /**
     * 向量存储初始化配置
     * @param dashscopeEmbeddingModel 嵌入模型（例如通义 Embedding 模型），用于将文本转为向量表示
     * @return 向量存储实例
     */
    @Bean
    VectorStore loveAppVectorStore(EmbeddingModel dashscopeEmbeddingModel) {
        /**
         * 创建一个简单的内存向量存储实现SimpleVectorStore。内部会用传入的dashscopeEmbeddingModel模型 把文本向量化。
         * 注意它这里还没有向量化，它是simpleVectorStore.add(documentList);这个时候才开始向量化
         */
        SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel)
                .build();
        // 加载文档
        // 调用 LoveAppDocumentLoader 读取所有 Markdown 文档 → 结构化为 Document。
        List<Document> documentList = loveAppDocumentLoader.loadMarkdowns();
        // simpleVectorStore.add(documentList);

        // 自主切分文档 --> 这个切词器切的不好，不建议用这个切词器
        //List<Document> splitDocuments = myTokenTextSplitter.splitCustomized(documentList);


        List<Document> enrichedDocuments = myKeywordEnricher.enrichDocuments(documentList);
        // 每一段文本会被用 dashscopeEmbeddingModel 生成向量；存储在向量数据库中。
        simpleVectorStore.add(enrichedDocuments);
        return simpleVectorStore;
    }
}
